<?php
/**
 * 定时任务控制器
 */

declare (strict_types = 1);

namespace app\controller\home;

use app\BaseController;
use think\facade\Db;
use think\facade\Request;

class Task extends BaseController
{
    /**
     * 获取定时任务列表（向后兼容方法）
     */
    public function index()
    {
        return $this->list();
    }
    
    /**
     * 获取定时任务列表
     */
    public function list()
    {
        try {
            // 查询定时任务列表
            $list = Db::name('timing_task')
                ->where('delete_time', 0)
                ->order('id', 'desc')
                ->select()
                ->toArray();
            
            // 格式化时间
            foreach ($list as &$item) {
                if ($item['last_run_time'] > 0) {
                    $item['last_run_time_format'] = date('Y-m-d H:i:s', $item['last_run_time']);
                }
                if ($item['next_run_time'] > 0) {
                    $item['next_run_time_format'] = date('Y-m-d H:i:s', $item['next_run_time']);
                }
                if ($item['create_time'] > 0) {
                    $item['create_time_format'] = date('Y-m-d H:i:s', $item['create_time']);
                }
                if ($item['update_time'] > 0) {
                    $item['update_time_format'] = date('Y-m-d H:i:s', $item['update_time']);
                }
            }
            
            return json([
                'code' => 0,
                'msg' => 'success',
                'data' => $list
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '查询失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 查看定时任务详情
     */
    public function view()
    {
        try {
            $param = Request::param();
            
            if (empty($param['id'])) {
                return json(['code' => 400, 'msg' => '参数错误']);
            }
            
            // 查询定时任务详情
            $task = Db::name('timing_task')
                ->where('id', $param['id'])
                ->where('delete_time', 0)
                ->find();
            
            if (empty($task)) {
                return json(['code' => 404, 'msg' => '定时任务不存在']);
            }
            
            // 格式化时间
            if ($task['last_run_time'] > 0) {
                $task['last_run_time_format'] = date('Y-m-d H:i:s', $task['last_run_time']);
            }
            if ($task['next_run_time'] > 0) {
                $task['next_run_time_format'] = date('Y-m-d H:i:s', $task['next_run_time']);
            }
            if ($task['create_time'] > 0) {
                $task['create_time_format'] = date('Y-m-d H:i:s', $task['create_time']);
            }
            if ($task['update_time'] > 0) {
                $task['update_time_format'] = date('Y-m-d H:i:s', $task['update_time']);
            }
            
            // 状态名称
            $typesNames = [
                1 => '系统任务',
                2 => '普通任务',
                3 => '自定义任务'
            ];
            $task['types_name'] = isset($typesNames[$task['types']]) ? $typesNames[$task['types']] : '未知';
            
            return json([
                'code' => 0,
                'msg' => 'success',
                'data' => $task
            ]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '查询失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 新增定时任务
     */
    public function add()
    {
        try {
            $param = Request::param();
            
            // 数据验证
            if (empty($param['title'])) {
                return json(['code' => 400, 'msg' => '任务名称不能为空']);
            }
            
            if (empty($param['name'])) {
                return json(['code' => 400, 'msg' => '任务标识不能为空']);
            }
            
            if (empty($param['link'])) {
                return json(['code' => 400, 'msg' => '执行链接不能为空']);
            }
            
            // 检查任务标识是否已存在
            $exist = Db::name('timing_task')
                ->where('name', $param['name'])
                ->where('delete_time', 0)
                ->find();
            
            if ($exist) {
                return json(['code' => 400, 'msg' => '任务标识已存在']);
            }
            
            $data = [
                'title' => $param['title'],
                'name' => $param['name'],
                'link' => $param['link'],
                'types' => $param['types'] ?? 3,
                'desc' => $param['desc'] ?? '',
                'create_time' => time(),
                'update_time' => time()
            ];
            
            // 新增定时任务
            $taskId = Db::name('timing_task')->insertGetId($data);
            
            return json(['code' => 0, 'msg' => '保存成功', 'data' => ['id' => $taskId]]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '保存失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 编辑定时任务
     */
    public function edit()
    {
        try {
            $param = Request::param();
            
            // 数据验证
            if (empty($param['id'])) {
                return json(['code' => 400, 'msg' => '参数错误']);
            }
            
            if (empty($param['title'])) {
                return json(['code' => 400, 'msg' => '任务名称不能为空']);
            }
            
            if (empty($param['name'])) {
                return json(['code' => 400, 'msg' => '任务标识不能为空']);
            }
            
            if (empty($param['link'])) {
                return json(['code' => 400, 'msg' => '执行链接不能为空']);
            }
            
            // 检查定时任务是否存在
            $task = Db::name('timing_task')
                ->where('id', $param['id'])
                ->where('delete_time', 0)
                ->find();
            
            if (empty($task)) {
                return json(['code' => 404, 'msg' => '定时任务不存在']);
            }
            
            // 检查任务标识是否已存在（排除自己）
            $exist = Db::name('timing_task')
                ->where('name', $param['name'])
                ->where('id', '<>', $param['id'])
                ->where('delete_time', 0)
                ->find();
            
            if ($exist) {
                return json(['code' => 400, 'msg' => '任务标识已存在']);
            }
            
            $data = [
                'id' => $param['id'],
                'title' => $param['title'],
                'name' => $param['name'],
                'link' => $param['link'],
                'types' => $param['types'] ?? $task['types'],
                'desc' => $param['desc'] ?? $task['desc'],
                'update_time' => time()
            ];
            
            // 更新定时任务
            Db::name('timing_task')->update($data);
            
            return json(['code' => 0, 'msg' => '更新成功', 'data' => ['id' => $param['id']]]);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '更新失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 删除定时任务
     */
    public function del()
    {
        try {
            $param = Request::param();
            
            if (empty($param['id'])) {
                return json(['code' => 400, 'msg' => '参数错误']);
            }
            
            // 检查定时任务是否存在
            $task = Db::name('timing_task')
                ->where('id', $param['id'])
                ->where('delete_time', 0)
                ->find();
            
            if (empty($task)) {
                return json(['code' => 404, 'msg' => '定时任务不存在']);
            }
            
            // 软删除定时任务
            Db::name('timing_task')
                ->where('id', $param['id'])
                ->update([
                    'delete_time' => time(),
                    'update_time' => time()
                ]);
            
            return json(['code' => 0, 'msg' => '删除成功']);
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '删除失败: ' . $e->getMessage()]);
        }
    }
    
    /**
     * 保存定时任务（新增或编辑）
     */
    public function save()
    {
        try {
            $param = Request::param();
            
            // 根据是否有ID判断是新增还是编辑
            if (empty($param['id'])) {
                // 新增任务
                // 数据验证
                if (empty($param['title'])) {
                    return json(['code' => 400, 'msg' => '任务名称不能为空']);
                }
                
                // 使用link作为name（标识符）
                $name = $param['link'] ?? '';
                if (empty($name)) {
                    return json(['code' => 400, 'msg' => '执行链接不能为空']);
                }
                
                // 检查任务标识是否已存在
                $exist = Db::name('timing_task')
                    ->where('link', $param['link'])
                    ->where('delete_time', 0)
                    ->find();
                
                if ($exist) {
                    return json(['code' => 400, 'msg' => '相同的任务链接已存在']);
                }
                
                $data = [
                    'title' => $param['title'],
                    'name' => !empty($param['name']) ? $param['name'] : 'task_'.time(),
                    'link' => $param['link'],
                    'types' => $param['types'] ?? 3,
                    'desc' => $param['desc'] ?? '',
                    'create_time' => time(),
                    'update_time' => time()
                ];
                
                // 新增定时任务
                $taskId = Db::name('timing_task')->insertGetId($data);
                
                return json(['code' => 0, 'msg' => '保存成功', 'data' => ['id' => $taskId]]);
            } else {
                // 编辑任务
                // 数据验证
                if (empty($param['title'])) {
                    return json(['code' => 400, 'msg' => '任务名称不能为空']);
                }
                
                if (empty($param['link'])) {
                    return json(['code' => 400, 'msg' => '执行链接不能为空']);
                }
                
                // 检查定时任务是否存在
                $task = Db::name('timing_task')
                    ->where('id', $param['id'])
                    ->where('delete_time', 0)
                    ->find();
                
                if (empty($task)) {
                    return json(['code' => 404, 'msg' => '定时任务不存在']);
                }
                
                // 检查任务链接是否已存在（排除自己）
                $exist = Db::name('timing_task')
                    ->where('link', $param['link'])
                    ->where('id', '<>', $param['id'])
                    ->where('delete_time', 0)
                    ->find();
                
                if ($exist) {
                    return json(['code' => 400, 'msg' => '相同的任务链接已存在']);
                }
                
                $data = [
                    'id' => $param['id'],
                    'title' => $param['title'],
                    'link' => $param['link'],
                    'types' => $param['types'] ?? $task['types'],
                    'desc' => $param['desc'] ?? $task['desc'],
                    'update_time' => time()
                ];
                
                // 如果提供了name，则更新name
                if (!empty($param['name'])) {
                    $data['name'] = $param['name'];
                }
                
                // 更新定时任务
                Db::name('timing_task')->update($data);
                
                return json(['code' => 0, 'msg' => '更新成功', 'data' => ['id' => $param['id']]]);
            }
        } catch (\Exception $e) {
            return json(['code' => 500, 'msg' => '保存失败: ' . $e->getMessage()]);
        }
    }
    

    
    /**
     * 向后兼容方法：删除定时任务
     */
    public function delete()
    {
        return $this->del();
    }
}